﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace Win8Camp.Snap
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            //Atribuimos um handler para o evento SizeChanged
            //esse evento é disparado quando a app muda de tamanho.
            //Como em Metro UI só ha tres valores possiveis 
            //quando o usuario mudar o estado para Snap|Fill|Full
            //esse evento ira ser disparado
            SizeChanged += MainPage_SizeChanged;
        }

        /// <summary>
        /// Nesse metodo capturamos o evento lançado quando o usuario 
        /// muda o estado(tamanho da app). Aqui podemos pegar o tamanho 
        /// da mesma em pixels. Porém podemos pegar o valor de enumeração
        /// que representa o estado da app. Esse valor pode ser pego em qualquer lugar
        /// portanto podemos, se desejarmos guardar esse valor de enumeração em uma variavel
        /// ow mesmo passar para outro metodo.
        /// </summary>
        void MainPage_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            //using System.Diagnostics;
            //Permite que na tela de output escevevamos strings.
            //Vale notar que isso não afeta o desenpenho da applicação
            //pois não é incluso a chamada a esses metodos na build tipo Release

            //pelo argumento "e" do tipo SizeChangeEventsArgs, podemos 
            //pegar o valor em pixels da tela, assim como o valor anterior
            //que a mesma tinha. Util se precisamos fazer alguma logica de 
            //redimencionar imagens etc.
            Debug.WriteLine("Novo tamanho: " + e.NewSize);
            Debug.WriteLine("Tamanho anterior " + e.PreviousSize);


            ///Por meio do Value do ApplicationView (using Windows.UI.ViewManagement)
            ///temos um valor de enumeração cotendo o estado atual da applicação.
            ///estes são Filled (75%¨da tela) FullScreen(100%, tanto portrait quanto landscape)
            ///e snap(25%)
            var value = ApplicationView.Value;
            switch (value)
            {
                case ApplicationViewState.Filled:
                    Debug.WriteLine("Nossso app esta em Fill");
                    break;
                case ApplicationViewState.FullScreenLandscape:
                    Debug.WriteLine("Nossso app esta em Full de landscape");
                    break;
                case ApplicationViewState.FullScreenPortrait:
                    Debug.WriteLine("Nossso app esta em Full de portrait");
                    break;
                case ApplicationViewState.Snapped:
                    Debug.WriteLine("Nossso app esta em Snap");
                    break;
                default:
                    break;
            }

            ///Vale notar que não podemos progamaticamente mudar de Fill|Full
            ///para snap, porem podemos mudar de Snap para Fill|Full
            ///Veja o metodo abaixo para mais detalhes.
        }


        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            ///Não podemos mudar o estado da app. Com apenas um porém
            ///Fill->Full - NÃO
            ///Full->Fill - NÃO
            ///Fill->Snap - NÃO
            ///Snap->Fill - Sim, somente se o estado anterior dela for Fill
            ///Full->Snap - NÃO
            ///Snap->Full - Sim, somente se o estado anterior dela for Full
            ///
            ///Para isso utlizamos o metodo TryUnsnap, este metodo
            ///tenta mudar o estado de snap para fill ou full e retorna 
            ///um bool se conseguiu.
            ApplicationView.TryUnsnap();
        }

        
    }
}
